home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / ACC_CPX / CALC_2 / MAIN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-02-05  |  4.8 KB  |  231 lines

  1. /*
  2.  *    GEM calculator
  3.  *    resource-independent driver, patterned after DRI doodle
  4.  *    Copyright 1985 Axel T. Schreiner, Ulm, W-Germany
  5.  */
  6.  
  7. #include <obdefs.h>
  8. #include <gemdefs.h>
  9.  
  10. /*
  11.  *    tunable
  12.  */
  13.  
  14. #define    NORESOURCE    form_alert(1, "[3][Cannot find resource file][ Quit ]")
  15. #define    NOWINDOW    form_alert(1, "[3][Cannot open window][ Quit ]")
  16. #define    NOALERT        form_alert(1, "[3][Cannot find error message][ Ok ]")
  17.  
  18. /*
  19.  *    definitions
  20.  */
  21.  
  22. #define    DESK    0            /* desktop window */
  23. #define    WINDOW    (NAME|CLOSER|MOVER)    /* window options */
  24.  
  25. /*
  26.  *    macros
  27.  */
  28.  
  29. #define    Grect(p)    (p)->g_x, (p)->g_y, (p)->g_w, (p)->g_h
  30. #define    aGrect(p)    &(p)->g_x, &(p)->g_y, &(p)->g_w, &(p)->g_h
  31.  
  32. /*
  33.  *    global variables for VDI
  34.  */
  35.  
  36. int contrl[12], intin[128], intout[128], ptsin[128], ptsout[128];
  37.  
  38. /*
  39.  *    locally needed variables for VDI and AES
  40.  */
  41.  
  42. extern OBJECT * Resource;        /* main tree of resource */
  43. extern char Name[];            /* main tree window name */
  44. static GRECT shrink;            /* shrunken rectangle */
  45.  
  46. /*
  47.  *    alert utilities
  48.  */
  49.  
  50. int Alert(name)                /* show an alert */
  51.     int name;            /* #define'd number of alert */
  52. {    char * addr;
  53.  
  54.     if (rsrc_gaddr(R_STRING, name, &addr))
  55.         return form_alert(1, addr);
  56.     return NOALERT;
  57. }
  58.  
  59. #ifdef    DEBUG                /* debugging printer */
  60.  
  61.     static Debug(fmt, v1, v2, v3, v4)
  62.         char * fmt;
  63.     {    char buf1[80], buf2[80];
  64.  
  65.         sprintf(buf1, fmt, v1, v2, v3, v4);
  66.         sprintf(buf2, "[0][%s][ Ok ]", buf1);
  67.         form_alert(1, buf2);
  68.     }
  69.  
  70. #endif
  71.  
  72. /*
  73.  *    initialization
  74.  */
  75.  
  76. static int init(vp, wp)
  77.     int * vp;            /* return virtual workstation handle */
  78.     int * wp;            /* return window handle */
  79. {    int work_in[11], work_out[57];
  80.     GRECT curr, work;
  81.     int i;
  82.  
  83.     if (appl_init() == -1)
  84.         return 4;
  85.     wind_update(BEG_UPDATE);
  86.     graf_mouse(HOURGLASS, 0L);
  87.  
  88.     /*
  89.      *    open workstation
  90.      */
  91.  
  92.     for (i = 0; i < 10; work_in[i++] = 1)
  93.         ;
  94.     work_in[i] = 2;            /* raster coordinates */
  95.     *vp = graf_handle(&i, &i, &i, &i);
  96.     v_opnvwk(work_in, vp, work_out);
  97.     if (! *vp)
  98.         return 1;        /* no workstation */
  99.  
  100.     /*
  101.      *    get resource
  102.      */
  103.  
  104.     if (! Load())
  105.     {    graf_mouse(ARROW, 0L);
  106.         NORESOURCE;
  107.         return 1;        /* no resource file */
  108.     }
  109.  
  110.     /*
  111.      *    establish window and center main tree
  112.      */
  113.  
  114.     wind_get(DESK, WF_WORKXYWH, aGrect(&curr));
  115.     shrink.g_x = curr.g_w/2;
  116.     shrink.g_y = curr.g_h/2;
  117.     shrink.g_w = 1;
  118.     shrink.g_h = 1;
  119.  
  120.     work.g_w = Resource->ob_width;
  121.     work.g_h = Resource->ob_height;
  122.     Resource->ob_x = work.g_x = (curr.g_w - work.g_w) / 2;
  123.     Resource->ob_y = work.g_y = (curr.g_h - work.g_h) / 2;
  124.     wind_calc(WC_BORDER, WINDOW, Grect(&work), aGrect(&curr));
  125.  
  126.     if ((*wp = wind_create(WINDOW, Grect(&curr))) == -1)
  127.     {    NOWINDOW;
  128.         return 3;        /* no window */
  129.     }
  130.     wind_set(*wp, WF_NAME, Name, 0, 0);
  131.     graf_growbox(Grect(& shrink), Grect(& curr));
  132.     wind_open(*wp, Grect(& curr));
  133.  
  134.     graf_mouse(ARROW, 0L);
  135.     wind_update(END_UPDATE);
  136.     return 0;
  137. }
  138.  
  139. /*
  140.  *    termination
  141.  */
  142.  
  143. static term(code, vh, wh)
  144.     int code;            /* amount to clean up */
  145.     int vh;                /* virtual workstation handle */
  146.     int wh;                /* window handle */
  147. {    GRECT curr;
  148.  
  149.     switch (code) {
  150.     case 0:                /* normal termination */
  151.         wind_get(wh, WF_CURRXYWH, aGrect(& curr));
  152.         wind_close(wh);
  153.         graf_shrinkbox(Grect(& shrink), Grect(& curr));
  154.         wind_delete(wh);
  155.     case 3:                /* no window */
  156.     case 2:                /* no menu */
  157.         v_clsvwk(vh);
  158.     case 1:                /* no workstation */
  159.         if (code)
  160.             wind_update(END_UPDATE);
  161.         appl_exit();
  162.     case 4:                /* nothing at all */
  163.         break;
  164.     }
  165. }
  166.  
  167. /*
  168.  *    main program
  169.  */
  170.  
  171. main()
  172. {    int code, vh, wh;        /* init/term information */
  173.     int event, done, i, m[8], x, y, key;
  174.     OBJECT * op;
  175.  
  176.     if (! (code = init(&vh, &wh)))
  177.  
  178.     do
  179.     {    event = evnt_multi(MU_KEYBD|MU_BUTTON|MU_MESAG,
  180.             1, 1, 1,    /* 1 click on left button */
  181.             0, 0, 0, 0, 0,    /* no area */
  182.             0, 0, 0, 0, 0,    /* no second area */
  183.             m,        /* message buffer */
  184.             0, 0,        /* no timer */
  185.             &x, &y,        /* result coordinates */
  186.             &i, &i,        /* must be left button */
  187.             &key,        /* keypress */
  188.             &i);        /* must be one click */
  189.  
  190.         wind_update(BEG_UPDATE);
  191.  
  192.         done = 0;
  193.  
  194.         if (event & MU_KEYBD)
  195.             done |= Keyboard(key);
  196.  
  197.         if ((event & MU_BUTTON)
  198.             && (i = objc_find(Resource, ROOT, MAX_DEPTH, x, y)) >= 0)
  199.             done |= Button(i);
  200.  
  201.         if (event & MU_MESAG) switch (m[0]) {
  202.  
  203.         case WM_REDRAW:        /* need to redraw */
  204.             objc_draw(Resource, ROOT, MAX_DEPTH,
  205.                 m[4], m[5], m[6], m[7]);
  206.             break;
  207.  
  208.         case WM_TOPPED:        /* something got topped */
  209.         case WM_NEWTOP:        /* we got topped */
  210.             wind_set(m[3], WF_TOP, 0, 0, 0, 0);
  211.             break;
  212.  
  213.         case WM_CLOSED:        /* time to quit */
  214.             done = 1;
  215.             break;
  216.  
  217.         case WM_MOVED:        /* we got moved */
  218.             wind_set(m[3], WF_CURRXYWH, m[4], m[5], m[6], m[7]);
  219.             wind_get(m[3], WF_WORKXYWH, m+4, m+5, m+6, m+7);
  220.             Resource->ob_x = m[4];
  221.             Resource->ob_y = m[5];
  222.             break;
  223.         }
  224.  
  225.         wind_update(END_UPDATE);
  226.  
  227.     } while (! done);
  228.  
  229.     term(code, vh, wh);
  230. }
  231. ə